home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / mui / bcc_src.lha / Parser / CreateInitCl.cpp < prev    next >
C/C++ Source or Header  |  1998-03-15  |  3KB  |  153 lines

  1. #include "CreateInitCl.h"
  2.  
  3. #include "Global.h"
  4. #include "Family.h"
  5. #include "ClassDef.h"
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10.  
  11. short CreateInitCl::Create( void )
  12. {
  13.  
  14.  FILE *fh;
  15.  
  16.  if( !ClassList.isEmpty() ) {
  17.  
  18.      /* Sort */
  19.      
  20.      ClassDef *a, *b;
  21.      short nmax, n = 0;
  22.      
  23.      nmax = ClassList.Count();
  24.      
  25.      printf( "There are %hd classes\n", nmax );
  26.  
  27.      nmax *= nmax;
  28.  
  29.     FScan( ClassDef, cd, &ClassList ) {
  30.         if( cd->sw & SW_SELFCREATE ) {
  31.              cd = (ClassDef*)cd->Prev();
  32.             cd->Next()->Remove();
  33.         } else
  34.          if( cd->superpriv ) {
  35.              for( a = (ClassDef*)cd->Prev(); a->Prev(); a = (ClassDef*)a->Prev() ) {
  36.                  if( !strcmp( cd->PSuper, a->Name ) ) goto OK;
  37.              }
  38.              
  39.              for( b = 0, a = (ClassDef*)cd->Next(); a->Next(); a = (ClassDef*)a->Next() ) {
  40.                  if( !strcmp( cd->PSuper, a->Name ) ) {
  41.                      b = a;
  42.                      break;
  43.                  }
  44.              }
  45.              
  46.              if( !b ) {
  47.                  printf( "Error: Super class \"%s\" of \"%s\" not found\n", cd->PSuper, cd->Name );
  48.                  return 0;
  49.              }
  50.              
  51.              cd->Swap( b );    
  52.              
  53.              n++;
  54.              
  55.              if( n > nmax ) {
  56.                  printf( "Error: Infinite loop when sorting super classes\n" );
  57.                  return 0;
  58.              }
  59.              
  60.              cd = (ClassDef*)b->Prev();
  61.          
  62.          }
  63.          OK:
  64.      }
  65.  
  66.  
  67.     if( !(fh = fopen( "initcl.c", "w" )) ) {
  68.          printf( "Can not open ouput file\n" );
  69.          return 0;
  70.     }
  71.     
  72.     printf( "Creating \"initcl.c\" ...\n" );
  73.  
  74.     ins_every.Insert( fh );
  75.     ins_initcl.Insert( fh );
  76.  
  77.     FScan( ClassDef, c1, &ClassList ) {
  78.         switch( *c1->type ) {
  79.             case 'B':
  80.                 fprintf( fh, "struct IClass *%s_Create( void );\n", c1->Name);
  81.                 break;
  82.             default:
  83.                 fprintf( fh, "struct MUI_CustomClass *%s_Create( void );\n", c1->Name);
  84.         }
  85.     }
  86.  
  87.     fprintf( fh, "\n#include \"initcl.h\"\n\n" );
  88.  
  89.  
  90.     FScan( ClassDef, c2, &ClassList ) {
  91.         switch( *c2->type ) {
  92.             case 'B':
  93.                 fprintf( fh, "struct IClass *cl_%s;\n", c2->Name);
  94.                 break;
  95.             default:
  96.                 fprintf( fh, "struct MUI_CustomClass *cl_%s;\n", c2->Name);
  97.         }
  98.     }
  99.  
  100.     
  101.     fprintf( fh, "\nshort _initclasses( void )\n{\n" );
  102.     
  103.     FScan( ClassDef, c3, &ClassList ) {
  104.         fprintf( fh, "    if( !(cl_%s = %s_Create()) ) goto error;\n", c3->Name, c3->Name );
  105.     }
  106.     
  107.     fprintf( fh, "\n    return 1;\n error:\n    _freeclasses();\n    return 0;\n}\n\n" );
  108.     
  109.     fprintf( fh, "void _freeclasses( void )\n{\n" );
  110.  
  111.     ClassDef *c4;
  112.     for( c4 = (ClassDef*)ClassList.Last(); c4->Prev(); c4 = (ClassDef*)c4->Prev() ) {
  113.         switch( *c4->type ) {
  114.             case 'B':
  115.                 fprintf( fh, "    FreeClass( cl_%s );\n", c4->Name );
  116.                 break;
  117.             default:
  118.                 fprintf( fh, "    MUI_DeleteCustomClass( cl_%s );\n", c4->Name );
  119.         }
  120.     }
  121.     
  122.     fprintf( fh, "}\n" );
  123.         
  124.     fclose( fh );
  125.  
  126.  
  127.     if( !(fh = fopen( "initcl.h", "w" )) ) {
  128.          printf( "Can not open ouput file\n" );
  129.          return 0;
  130.     }
  131.  
  132.     printf( "Creating \"initcl.h\" ...\n" );
  133.      
  134.     FScan( ClassDef, c5, &ClassList ) {
  135.         switch( *c5->type ) {
  136.             case 'B':
  137.                 fprintf( fh, "extern struct IClass *cl_%s;\n", c5->Name);
  138.                 break;
  139.             default:
  140.                 fprintf( fh, "extern struct MUI_CustomClass *cl_%s;\n", c5->Name);
  141.         }
  142.     }
  143.     
  144.     fprintf( fh, "\nshort _initclasses( void );\nvoid _freeclasses( void );\n" );
  145.  
  146.  }
  147.  
  148.  if( ClassList.CheckDoubleTags() ) return 0;
  149.  
  150.  return 1;
  151.  
  152. }
  153.